import { currentTime } from "../utils"
import NowLine from "./now_line"
import DayLine from "./day_line"
import BusyTimeBlock from "./busy_time_block"
import TimeNumberPosition from "./time_number_position"

/**
 * 用于存储及回调组件的各种位置
 * 在组件初始化时，调用init，初始化位置
 * 再通过 touchLogic得到了move之后传入PositionLogic，获取到全局所有子组件的位置信息
 */
class PositionLogic {
	
	_width = 0;		// 组件的宽度
	_height = 0;		// 组件的高度
	_minDay = 0;		// 组件显示时间范围(天数)
	_maxDay = 0;		// 组件显示时间范围(天数)
	_visiableTimeInHour = 0;		// 可视范围内可以查看的时间长度(小时)
	_visiableTimeInMinute = 0;		// 可视范围内可以查看的时间长度(分钟)
	_hourHeightInPx = 0;			// 一小时占用的高度
	_currentPositionInPx = 0;	// 当前的位置
	_offset = 0;				// 偏移量
	
	
	_stage;				// kanvojs 组件
	_layer;				// kanvojs 组件
	
	
	/**
	 * 右侧数字显示的位置信息
	 */
	_timeNumberPosition = new TimeNumberPosition();
	
	/**
	 * 显示日期信息的横线位置
	 */
	_dayLine = new DayLine();
	
	/**
	 * 显示现在时间
	 */
	_nowLine = new NowLine();
	
	/**
	 * 时间占用区块
	 */
	_busyTimeBlock = new BusyTimeBlock();
	
	// 占用时间段
	busyTime = null;
	
	/**
	 * 初始化
	 * @param {Object} busyTime 占用时间段
	 */
	init = (minDay, maxDay, busyTime, width, height, dayBegin, dayEnd) => {
		const nowDate = currentTime();
		this._width = width;
		this._height = height;
		// 单位转换为分钟
		this._minDay = minDay;		
		this._maxDay = maxDay;
		
		// 计算可视区间可以查看的时间长度
		this._hourHeightInPx = 50;
		this._visiableTimeInHour = (parseFloat(height) / parseFloat(this._hourHeightInPx)).toFixed(2);
		this._visiableTimeInMinute = (this._visiableTimeInHour * 60).toFixed(2);
		
		// 初始化当前位置为0，以现在时间为标准，回调出去之后，实际位置应该 = position + offset
		this._currentPositionInPx = 0;
		this._offset = 0;
		
		this._stage = new Konva.Stage({
			container: 'container',
			width: width,
			height: height
		});
		this._layer = new Konva.Layer();
		this._stage.add(this._layer);
		
		// 刷新各个子组件的位置
		this._nowLine.init(this._currentPositionInPx, this._layer, this._height);
		this._dayLine.init(this._currentPositionInPx, this._layer, this._hourHeightInPx, this._height);
		this._timeNumberPosition.init(this._currentPositionInPx, this._layer, this._hourHeightInPx, this._height);
		this._busyTimeBlock.init(this._currentPositionInPx);
	}
	
	/**
	 * 移动一定距离
	 * @param {Object} deltaX
	 * @param {Object} deltaY
	 */
	move = (deltaX, deltaY) => {
		this._currentPositionInPx -= deltaY;
		// 刷新各个子组件的位置
		this._timeNumberPosition.move({deltaX, deltaY});
		this._nowLine.move({deltaX, deltaY});
		this._dayLine.move({deltaX, deltaY});
		this._busyTimeBlock.move({deltaX, deltaY});
	}
}

export default PositionLogic;